Introduction

The Royal Society for the Prevention of Cruelty to Animals, or RSPCA, is Australia’s oldest, largest and most trusted animal welfare organisation. In the year of 2020 alone they received over 1 million animals into their shelters and adoption centres across the country. Through hard work and concerted efforts, they have managed to increase their rates of adoption and reclaiming, improving the outcomes for hundreds of thousands of cats and dogs, who have either been reunited with their owners or have found a new home.

In this presentation, I will answer questions that the RSPCA has asked for the purposes of gaining more insight into the animals, especially the cats and dogs, of Australia. This will help them make more informed decisions in the future through the power of data, with the goal of further increasing their rates of adoption and reclaiming. I believe my analysis will help the RSPCA move forward in their goal and improve animal welfare across Australia as a whole.

The Data

For this project, I was given three sources of data. The first is from the open RSPCA database and covers Australia as a whole, divided into regions. It looks at the outcomes for cats, dogs and other animals the RSPCA has received into its care (i.e, whether they were rehomed, euthanised, still in stock and so on), with data spanning from 1999 to 2018. The data is from a trusted source and is of high quality.

Here is a map of Australian states for reference: Australia by State

The next two sources I was given concern data specific to Townsville and Brisbane, two large Australian cities.

Townsville is a city on the north-eastern coast of Queensland, Australia. With a population of 180,000, it is the largest settlement in North Queensland; it is unofficially considered the capital of North Queensland.

Brisbane is the official capital of Queensland, and is about 1000km South East of Townsville, in the centre of South East Queensland. It’s population is about 2.6 million. Both datasets consists of data gathered by their respective councils, and concern the volume and type of animal complaints received overtime. This is further broken by suburb. Both these datasets come from local councils and are trusted sources. Here’s another map showing the location of both of these cities:

Townsville to Brisbane

Business Questions

Here are the business questions I have been tasked with investigating:

Is there are a trend in injuries By Region, and is there different peaks of times of year per region?

Analysis on the types of animals that are injured, this also by Region – is there a species that is more liable to injury in certain regions?

What is the outcome? Does this differ by region?

Total call volume for complaint calls: How has this trended over time? Is there a particular animal being called about the most? Do particular suburbs have different type of complaint calls? Do they call about different animals?

Business Intelligence – using the insights you have found, can you predict how this might look for the upcoming year?

Analysis

First, I looked at the total call volume for complaint calls, to see how this trended over time.

As you can see looking at these graphs, there is a noticeable seasonality. This can clearly be seen in the Townsville graph, with calls peaking around July/August, which is winter for Australia. For Brisbane, which is broken down by quarter rather than month, there does appear to be seasonality but it is less pronounced and we do not have enough data to say this definitively.

So there is evidence of seasonality, but I was also interested to investigate the average overtime in general. Here is some graphs which show this:

With these graphs, we can see more clearly the general trend, ignoring seasonality. For Townsville, there is a steady increase up to 2017 and then a steady decline, to a similar place to where the number of calls started.

For Brisbane, we can see a more clear trend upward over time, though there is only 4 years of data. This means any conclusions to be drawn from this should be taken with a grain of salt.

Next, I looked at which animals were being called about the most. Again, I looked at both cities, and this time the conclusion was much more clear.

For Townsville, dogs are responsible for 10x the amount of calls as cats!

As for Brisbane, cats account for 35% of the calls that concern dogs. In fact, dogs account for half of all calls!

One interesting point is that the numbers for foxes are quite high for a wild animal. This is something that needs further investigation to learn more about.

So, we can see quite clearly that dogs account for the majority of the calls, and overshadow cats in second place by a large margin.

Now we will look at the data broken down by suburb and complaint type. This proved a little more difficult than one might first think. Brisbane has 192 suburbs, while Townsville has 85. I decided to first focus on the Townsville data, and distill the suburbs down to a more reasonable number. I wanted to look at suburbs with a similar amount of complaint calls. I focused on those with less than 500 and more than 100 calls. I decided that any suburb with less than 100 calls would be such a small number my percentages would be skewed, and no valid conclusions could be drawn.

So, here I have shown the relative percentages of complaint types for the suburbs. The data has been scaled, so that a suburb with a higher count doesn’t skew the data, and we can see proportions.

One thing to note here, is the vast variation in tolerance for noise. Most categories are consistent except this one. Cluden for example has a small percentage of noise complaints, while Bohle Plains has a huge percentage. This requires more investigation to figure out the root cause.

Looking at the same but in a different way, we get:

This graph shows the same thing as before but with counts rather than proportions. It allows us to see things in a different way. For example, we can see that Hyde Park has a disproportionate amount of private impounds, while Bohle plains has more noise complaints. This is consistent with the previous graph that showed us proportions, so we can be assured that our analysis is accurate

Looking at another subset of suburbs, this time those with total calls between 500 and 4000, we get this:

`summarise()` has grouped output by 'suburb'. You can override using the `.groups` argument.

What sticks out to me in these busier suburbs, is the variability in private impounds. Aitkenvale, Thuringowa Central and Douglas stand out as being proportionally very high in number of private impounds. More investigation is needed to find out the cause of this.

Now let’s look at things broken down by type of animal, rather than complaint type. Looking at the original set of suburbs, we get this:

Most suburbs have pretty much the same ratios of cats to dogs, except for Townsville City. This has close to 50:50 ratio, which is unprecedented for this data, and not seen in any other Townsville suburb (I checked even the other groups). This is the only suburb where this is the case. This could potentially indicate a large number of stray cats, but more investigation is needed to see why this is the case.

LS0tCnRpdGxlOiAiUHJlc2VudGF0aW9uIFNjcmlwdCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyMjIEludHJvZHVjdGlvbgoKVGhlIFJveWFsIFNvY2lldHkgZm9yIHRoZSBQcmV2ZW50aW9uIG9mIENydWVsdHkgdG8gQW5pbWFscywgb3IgUlNQQ0EsIGlzIEF1c3RyYWxpYSdzIG9sZGVzdCwgbGFyZ2VzdCBhbmQgbW9zdCB0cnVzdGVkIGFuaW1hbCB3ZWxmYXJlIG9yZ2FuaXNhdGlvbi4gSW4gdGhlIHllYXIgb2YgMjAyMCBhbG9uZSB0aGV5IHJlY2VpdmVkIG92ZXIgMSBtaWxsaW9uIGFuaW1hbHMgaW50byB0aGVpciBzaGVsdGVycyBhbmQgYWRvcHRpb24gY2VudHJlcyBhY3Jvc3MgdGhlIGNvdW50cnkuIFRocm91Z2ggaGFyZCB3b3JrIGFuZCBjb25jZXJ0ZWQgZWZmb3J0cywgdGhleSBoYXZlIG1hbmFnZWQgdG8gaW5jcmVhc2UgdGhlaXIgcmF0ZXMgb2YgYWRvcHRpb24gYW5kIHJlY2xhaW1pbmcsIGltcHJvdmluZyB0aGUgb3V0Y29tZXMgZm9yIGh1bmRyZWRzIG9mIHRob3VzYW5kcyBvZiBjYXRzIGFuZCBkb2dzLCB3aG8gaGF2ZSBlaXRoZXIgYmVlbiByZXVuaXRlZCB3aXRoIHRoZWlyIG93bmVycyBvciBoYXZlIGZvdW5kIGEgbmV3IGhvbWUuCgpJbiB0aGlzIHByZXNlbnRhdGlvbiwgSSB3aWxsIGFuc3dlciBxdWVzdGlvbnMgdGhhdCB0aGUgUlNQQ0EgaGFzIGFza2VkIGZvciB0aGUgcHVycG9zZXMgb2YgZ2FpbmluZyBtb3JlIGluc2lnaHQgaW50byB0aGUgYW5pbWFscywgZXNwZWNpYWxseSB0aGUgY2F0cyBhbmQgZG9ncywgb2YgQXVzdHJhbGlhLiBUaGlzIHdpbGwgaGVscCB0aGVtIG1ha2UgbW9yZSBpbmZvcm1lZCBkZWNpc2lvbnMgaW4gdGhlIGZ1dHVyZSB0aHJvdWdoIHRoZSBwb3dlciBvZiBkYXRhLCB3aXRoIHRoZSBnb2FsIG9mIGZ1cnRoZXIgaW5jcmVhc2luZyB0aGVpciByYXRlcyBvZiBhZG9wdGlvbiBhbmQgcmVjbGFpbWluZy4gSSBiZWxpZXZlIG15IGFuYWx5c2lzIHdpbGwgaGVscCB0aGUgUlNQQ0EgbW92ZSBmb3J3YXJkIGluIHRoZWlyIGdvYWwgYW5kIGltcHJvdmUgYW5pbWFsIHdlbGZhcmUgYWNyb3NzIEF1c3RyYWxpYSBhcyBhIHdob2xlLgoKCiMjIyBUaGUgRGF0YQoKRm9yIHRoaXMgcHJvamVjdCwgSSB3YXMgZ2l2ZW4gdGhyZWUgc291cmNlcyBvZiBkYXRhLiBUaGUgZmlyc3QgaXMgZnJvbSB0aGUgb3BlbiBSU1BDQSBkYXRhYmFzZSBhbmQgY292ZXJzIEF1c3RyYWxpYSBhcyBhIHdob2xlLCBkaXZpZGVkIGludG8gcmVnaW9ucy4gSXQgbG9va3MgYXQgdGhlIG91dGNvbWVzIGZvciBjYXRzLCBkb2dzIGFuZCBvdGhlciBhbmltYWxzIHRoZSBSU1BDQSBoYXMgcmVjZWl2ZWQgaW50byBpdHMgY2FyZSAoaS5lLCB3aGV0aGVyIHRoZXkgd2VyZSByZWhvbWVkLCBldXRoYW5pc2VkLCBzdGlsbCBpbiBzdG9jayBhbmQgc28gb24pLCB3aXRoIGRhdGEgc3Bhbm5pbmcgZnJvbSAxOTk5IHRvIDIwMTguIFRoZSBkYXRhIGlzIGZyb20gYSB0cnVzdGVkIHNvdXJjZSBhbmQgaXMgb2YgaGlnaCBxdWFsaXR5LgoKSGVyZSBpcyBhIG1hcCBvZiBBdXN0cmFsaWFuIHN0YXRlcyBmb3IgcmVmZXJlbmNlOgohW0F1c3RyYWxpYSBieSBTdGF0ZV0oZGF0YS9hdXN0cmFsaWFfYnlfc3RhdGUuanBlZykKCgpUaGUgbmV4dCB0d28gc291cmNlcyBJIHdhcyBnaXZlbiBjb25jZXJuIGRhdGEgc3BlY2lmaWMgdG8gVG93bnN2aWxsZSBhbmQgQnJpc2JhbmUsIHR3byBsYXJnZSBBdXN0cmFsaWFuIGNpdGllcy4KClRvd25zdmlsbGUgaXMgYSBjaXR5IG9uIHRoZSBub3J0aC1lYXN0ZXJuIGNvYXN0IG9mIFF1ZWVuc2xhbmQsIEF1c3RyYWxpYS4gV2l0aCBhIHBvcHVsYXRpb24gb2YgMTgwLDAwMCwgaXQgaXMgdGhlIGxhcmdlc3Qgc2V0dGxlbWVudCBpbiBOb3J0aCBRdWVlbnNsYW5kOyBpdCBpcyB1bm9mZmljaWFsbHkgY29uc2lkZXJlZCB0aGUgY2FwaXRhbCBvZiBOb3J0aCBRdWVlbnNsYW5kLiAKCkJyaXNiYW5lIGlzIHRoZSBvZmZpY2lhbCBjYXBpdGFsIG9mIFF1ZWVuc2xhbmQsIGFuZCBpcyBhYm91dCAxMDAwa20gU291dGggRWFzdCBvZiBUb3duc3ZpbGxlLCBpbiB0aGUgY2VudHJlIG9mIFNvdXRoIEVhc3QgUXVlZW5zbGFuZC4gSXQncyBwb3B1bGF0aW9uIGlzIGFib3V0IDIuNiBtaWxsaW9uLiAKQm90aCBkYXRhc2V0cyBjb25zaXN0cyBvZiBkYXRhIGdhdGhlcmVkIGJ5IHRoZWlyIHJlc3BlY3RpdmUgY291bmNpbHMsIGFuZCBjb25jZXJuIHRoZSB2b2x1bWUgYW5kIHR5cGUgb2YgYW5pbWFsIGNvbXBsYWludHMgcmVjZWl2ZWQgb3ZlcnRpbWUuIFRoaXMgaXMgZnVydGhlciBicm9rZW4gYnkgc3VidXJiLiBCb3RoIHRoZXNlIGRhdGFzZXRzIGNvbWUgZnJvbSBsb2NhbCBjb3VuY2lscyBhbmQgYXJlIHRydXN0ZWQgc291cmNlcy4gSGVyZSdzIGFub3RoZXIgbWFwIHNob3dpbmcgdGhlIGxvY2F0aW9uIG9mIGJvdGggb2YgdGhlc2UgY2l0aWVzOgoKIVtUb3duc3ZpbGxlIHRvIEJyaXNiYW5lXShkYXRhL3Rvd25zdmlsbGVfdG9fYnJpc2JhbmUucG5nKQoKIyMjIEJ1c2luZXNzIFF1ZXN0aW9ucwoKSGVyZSBhcmUgdGhlIGJ1c2luZXNzIHF1ZXN0aW9ucyBJIGhhdmUgYmVlbiB0YXNrZWQgd2l0aCBpbnZlc3RpZ2F0aW5nOgoKSXMgdGhlcmUgYXJlIGEgdHJlbmQgaW4gaW5qdXJpZXMgQnkgUmVnaW9uLCBhbmQgaXMgdGhlcmUgZGlmZmVyZW50IHBlYWtzIG9mIHRpbWVzIG9mIHllYXIgcGVyIHJlZ2lvbj8KCkFuYWx5c2lzIG9uIHRoZSB0eXBlcyBvZiBhbmltYWxzIHRoYXQgYXJlIGluanVyZWQsIHRoaXMgYWxzbyBieSBSZWdpb24g4oCTIGlzIHRoZXJlIGEgc3BlY2llcyB0aGF0IGlzIG1vcmUgbGlhYmxlIHRvIGluanVyeSBpbiBjZXJ0YWluIHJlZ2lvbnM/CgpXaGF0IGlzIHRoZSBvdXRjb21lPyBEb2VzIHRoaXMgZGlmZmVyIGJ5IHJlZ2lvbj8KClRvdGFsIGNhbGwgdm9sdW1lIGZvciBjb21wbGFpbnQgY2FsbHM6IEhvdyBoYXMgdGhpcyB0cmVuZGVkIG92ZXIgdGltZT8KSXMgdGhlcmUgYSBwYXJ0aWN1bGFyIGFuaW1hbCBiZWluZyBjYWxsZWQgYWJvdXQgdGhlIG1vc3Q/CkRvIHBhcnRpY3VsYXIgc3VidXJicyBoYXZlIGRpZmZlcmVudCB0eXBlIG9mIGNvbXBsYWludCBjYWxscz8gRG8gdGhleSBjYWxsIGFib3V0IGRpZmZlcmVudCBhbmltYWxzPwoKQnVzaW5lc3MgSW50ZWxsaWdlbmNlIOKAkyB1c2luZyB0aGUgaW5zaWdodHMgeW91IGhhdmUgZm91bmQsIGNhbiB5b3UgcHJlZGljdCBob3cgdGhpcyBtaWdodCBsb29rIGZvciB0aGUgdXBjb21pbmcgeWVhcj8KCgojIyMgQW5hbHlzaXMKCkZpcnN0LCBJIGxvb2tlZCBhdCB0aGUgdG90YWwgY2FsbCB2b2x1bWUgZm9yIGNvbXBsYWludCBjYWxscywgdG8gc2VlIGhvdyB0aGlzIHRyZW5kZWQgb3ZlciB0aW1lLiAKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgZXZhbD1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ2d0aGVtZXMpCnNvdXJjZSgiY2xlYW5pbmdfc2NyaXB0LlIiKQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgZXZhbD1UUlVFfQphbmltYWxfY29tcGxhaW50cyAlPiUgCiAgZ3JvdXBfYnkoZGF0ZV9yZWNlaXZlZCkgJT4lIAogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgJT4lIAogIGdncGxvdCgpICsKICBhZXMoeCA9IGRhdGVfcmVjZWl2ZWQsIHkgPSBjb3VudCkgKwogIGdlb21fbGluZShjb2wgPSAiYmx1ZSIpICsKICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiNiBtb250aHMiLCBkYXRlX2xhYmVscyA9ICIlYiAleSIpICsgCiAgbGFicyh0aXRsZSA9ICJUb3duc3ZpbGxlIENvbXBsYWludCBDYWxscyIsCiAgICAgICB4ID0gIlRpbWUiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgQ2FsbHMiKSArCiAgdGhlbWVfZWNvbm9taXN0KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMSwgZmFtaWx5ID0gIm1vbm8iLCBmYWNlID0gImJvbGQiLCBzaXplID0gNyksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMy4yKSwKICAgICAgICB0aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAibW9ubyIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjQpKSArCiAgICAgICAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gYXMuRGF0ZSgiMjAxNC0wNi0wMSIpLCB4bWF4ID0gYXMuRGF0ZSgiMjAxNC0wOC0wMSIpLCB5bWluID0gLUluZiwgeW1heCA9IEluZiwgZmlsbCA9ICJncmF5NzAiLCBhbHBoYSA9IDAuMykgKwogICAgICAgIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IGFzLkRhdGUoIjIwMTUtMDYtMDEiKSwgeG1heCA9IGFzLkRhdGUoIjIwMTUtMDgtMDEiKSwgeW1pbiA9IC1JbmYsIHltYXggPSBJbmYsIGZpbGwgPSAiZ3JheTcwIiwgYWxwaGEgPSAwLjMpICsKICAgICAgICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSBhcy5EYXRlKCIyMDE2LTA2LTAxIiksIHhtYXggPSBhcy5EYXRlKCIyMDE2LTA4LTAxIiksIHltaW4gPSAtSW5mLCB5bWF4ID0gSW5mLCBmaWxsID0gImdyYXk3MCIsIGFscGhhID0gMC4zKSArCiAgICAgICAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gYXMuRGF0ZSgiMjAxNy0wNi0wMSIpLCB4bWF4ID0gYXMuRGF0ZSgiMjAxNy0wOC0wMSIpLCB5bWluID0gLUluZiwgeW1heCA9IEluZiwgZmlsbCA9ICJncmF5NzAiLCBhbHBoYSA9IDAuMykgKwogICAgICAgIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IGFzLkRhdGUoIjIwMTgtMDYtMDEiKSwgeG1heCA9IGFzLkRhdGUoIjIwMTgtMDgtMDEiKSwgeW1pbiA9IC1JbmYsIHltYXggPSBJbmYsIGZpbGwgPSAiZ3JheTcwIiwgYWxwaGEgPSAwLjMpICsKICAgICAgICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSBhcy5EYXRlKCIyMDE5LTA2LTAxIiksIHhtYXggPSBhcy5EYXRlKCIyMDE5LTA4LTAxIiksIHltaW4gPSAtSW5mLCB5bWF4ID0gSW5mLCBmaWxsID0gImdyYXk3MCIsIGFscGhhID0gMC4zKQoKCgpsYWJlbHMgPC0gYygiUTEgMjAxNiIsICJRMiAyMDE2IiwgIlEzIDIwMTYiLCAiUTQgMjAxNiIsICJRMSAyMDE3IiwgIlEyIDIwMTciLCAiUTMgMjAxNyIsICJRNCAyMDE3IiwgIlExIDIwMTgiLCAiUTIgMjAxOCIsICJRMyAyMDE4IiwgIlE0IDIwMTgiLCAiUTEgMjAxOSIsICJRMiAyMDE5IiwgIlEzIDIwMTkiLCAiUTQgMjAxOSIsICJRMSAyMDIwIiwgIlEyIDIwMjAiKQoKYnJpc2JhbmVfY29tcGxhaW50cyAlPiUgCiAgZ3JvdXBfYnkoZGF0ZSkgJT4lIAogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBjb3VudCkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZShjb2wgPSAiYmx1ZSIpICsKICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMyBtb250aHMiLCBkYXRlX2xhYmVscyA9IGxhYmVscywgZXhwYW5kID0gYygwLDApKSArCiAgbGFicyh0aXRsZSA9ICJCcmlzYmFuZSBDb21wbGFpbnQgQ2FsbHMiLAogICAgICAgeCA9ICJUaW1lIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIENhbGxzIikgKwogIHRoZW1lX2Vjb25vbWlzdCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDUwLCB2anVzdCA9IDAuOCwgZmFtaWx5ID0gIm1vbm8iLCBmYWNlID0gImJvbGQiLCBzaXplID0gNyksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMy4yKSwKICAgICAgICB0aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAibW9ubyIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjQpKQoKCmBgYAoKCkFzIHlvdSBjYW4gc2VlIGxvb2tpbmcgYXQgdGhlc2UgZ3JhcGhzLCB0aGVyZSBpcyBhIG5vdGljZWFibGUgc2Vhc29uYWxpdHkuIFRoaXMgY2FuIGNsZWFybHkgYmUgc2VlbiBpbiB0aGUgVG93bnN2aWxsZSBncmFwaCwgd2l0aCBjYWxscyBwZWFraW5nIGFyb3VuZCBKdWx5L0F1Z3VzdCwgd2hpY2ggaXMgd2ludGVyIGZvciBBdXN0cmFsaWEuIEZvciBCcmlzYmFuZSwgd2hpY2ggaXMgYnJva2VuIGRvd24gYnkgcXVhcnRlciByYXRoZXIgdGhhbiBtb250aCwgdGhlcmUgZG9lcyBhcHBlYXIgdG8gYmUgc2Vhc29uYWxpdHkgYnV0IGl0IGlzIGxlc3MgcHJvbm91bmNlZCBhbmQgd2UgZG8gbm90IGhhdmUgZW5vdWdoIGRhdGEgdG8gc2F5IHRoaXMgZGVmaW5pdGl2ZWx5LgoKU28gdGhlcmUgaXMgZXZpZGVuY2Ugb2Ygc2Vhc29uYWxpdHksIGJ1dCBJIHdhcyBhbHNvIGludGVyZXN0ZWQgdG8gaW52ZXN0aWdhdGUgdGhlIGF2ZXJhZ2Ugb3ZlcnRpbWUgaW4gZ2VuZXJhbC4gSGVyZSBpcyBzb21lIGdyYXBocyB3aGljaCBzaG93IHRoaXM6CgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIGV2YWw9VFJVRX0KYW5pbWFsX2NvbXBsYWludHMgJT4lIAogIGdyb3VwX2J5KGRhdGVfcmVjZWl2ZWQpICU+JSAKICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBkYXRlX3JlY2VpdmVkLCB5ID0gY291bnQpKSArCiAgZ2VvbV9zbW9vdGgoKSArCiAgZ2VvbV9wb2ludCgpICsKICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSB5ZWFyIiwgZGF0ZV9sYWJlbHMgPSAiMjAleSIpICsKICBsYWJzKHRpdGxlID0gIlRvd25zdmlsbGUgQ29tcGxhaW50IENhbGxzIiwKICAgICAgIHggPSAiVGltZSIsCiAgICAgICB5ID0gIk51bWJlciBvZiBDYWxscyIpICsKICB0aGVtZV9lY29ub21pc3QoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQodmp1c3QgPSAxLCBmYW1pbHkgPSAibW9ubyIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDMuMiksCiAgICAgICAgdGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIm1vbm8iLCBmYWNlID0gImJvbGQiKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC40KSkKYGBgCgoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCBldmFsPVRSVUV9CmJyaXNiYW5lX2NvbXBsYWludHMgJT4lIAogIGdyb3VwX2J5KGRhdGUpICU+JSAKICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCB5ID0gY291bnQpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aCgpICsKICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSB5ZWFyIiwgZGF0ZV9sYWJlbHMgPSAiMjAleSIpICsKICBsYWJzKHRpdGxlID0gIkJyaXNiYW5lIENvbXBsYWludCBDYWxscyIsCiAgICAgICB4ID0gIlRpbWUiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgQ2FsbHMiKSArCiAgdGhlbWVfZWNvbm9taXN0KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMSwgZmFtaWx5ID0gIm1vbm8iLCBmYWNlID0gImJvbGQiKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQodmp1c3QgPSAzLjIpLAogICAgICAgIHRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJtb25vIiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNCkpCmBgYAoKV2l0aCB0aGVzZSBncmFwaHMsIHdlIGNhbiBzZWUgbW9yZSBjbGVhcmx5IHRoZSBnZW5lcmFsIHRyZW5kLCBpZ25vcmluZyBzZWFzb25hbGl0eS4gRm9yIFRvd25zdmlsbGUsIHRoZXJlIGlzIGEgc3RlYWR5IGluY3JlYXNlIHVwIHRvIDIwMTcgYW5kIHRoZW4gYSBzdGVhZHkgZGVjbGluZSwgdG8gYSBzaW1pbGFyIHBsYWNlIHRvIHdoZXJlIHRoZSBudW1iZXIgb2YgY2FsbHMgc3RhcnRlZC4KCkZvciBCcmlzYmFuZSwgd2UgY2FuIHNlZSBhIG1vcmUgY2xlYXIgdHJlbmQgdXB3YXJkIG92ZXIgdGltZSwgdGhvdWdoIHRoZXJlIGlzIG9ubHkgNCB5ZWFycyBvZiBkYXRhLiBUaGlzIG1lYW5zIGFueSBjb25jbHVzaW9ucyB0byBiZSBkcmF3biBmcm9tIHRoaXMgc2hvdWxkIGJlIHRha2VuIHdpdGggYSBncmFpbiBvZiBzYWx0LiAKCgpOZXh0LCBJIGxvb2tlZCBhdCB3aGljaCBhbmltYWxzIHdlcmUgYmVpbmcgY2FsbGVkIGFib3V0IHRoZSBtb3N0LiBBZ2FpbiwgSSBsb29rZWQgYXQgYm90aCBjaXRpZXMsIGFuZCB0aGlzIHRpbWUgdGhlIGNvbmNsdXNpb24gd2FzIG11Y2ggbW9yZSBjbGVhci4KCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgZXZhbD1UUlVFfQphbmltYWxfY29tcGxhaW50cyAlPiUgCiAgZ3JvdXBfYnkoYW5pbWFsX3R5cGUpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBhbmltYWxfdHlwZSkpICsKICBnZW9tX2Jhcihjb2wgPSAiYmx1ZSIsIGZpbGwgPSAiYmx1ZSIpICsKICBsYWJzKHRpdGxlID0gIlRvd25zdmlsbGUgQ29tcGxhaW50cyBieSBBbmltYWwiLAogICAgICAgeCA9ICJUeXBlIG9mIEFuaW1hbCIsCiAgICAgICB5ID0gIk51bWJlciBvZiBDb21wbGFpbnRzIikgKwogIHRoZW1lX2Vjb25vbWlzdCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDEsIGZhbWlseSA9ICJtb25vIiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMy4yKSwKICAgICAgICB0aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAibW9ubyIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjQpKQoKYnJpc2JhbmVfY29tcGxhaW50cyAlPiUgCiAgZ3JvdXBfYnkodHlwZV9vZl9hbmltYWwpICU+JQogIGdncGxvdChhZXMoeCA9IHR5cGVfb2ZfYW5pbWFsKSkgKwogIGdlb21fYmFyKGNvbCA9ICJibHVlIiwgZmlsbCA9ICJibHVlIikgKwogIGxhYnModGl0bGUgPSAiQnJpc2JhbmUgQ29tcGxhaW50cyBieSBBbmltYWwiLAogICAgICAgeCA9ICJUeXBlIG9mIEFuaW1hbCIsCiAgICAgICB5ID0gIk51bWJlciBvZiBDb21wbGFpbnRzIikgKwogIHRoZW1lX2Vjb25vbWlzdCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQwLCB2anVzdCA9IDEsIGZhbWlseSA9ICJtb25vIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDYpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDMuMiksCiAgICAgICAgdGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIm1vbm8iLCBmYWNlID0gImJvbGQiKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC40KSkKYGBgCgoKRm9yIFRvd25zdmlsbGUsIGRvZ3MgYXJlIHJlc3BvbnNpYmxlIGZvciAxMHggdGhlIGFtb3VudCBvZiBjYWxscyBhcyBjYXRzISAKCkFzIGZvciBCcmlzYmFuZSwgY2F0cyBhY2NvdW50IGZvciAzNSUgb2YgdGhlIGNhbGxzIHRoYXQgY29uY2VybiBkb2dzLiBJbiBmYWN0LCBkb2dzIGFjY291bnQgZm9yIGhhbGYgb2YgYWxsIGNhbGxzIQoKT25lIGludGVyZXN0aW5nIHBvaW50IGlzIHRoYXQgdGhlIG51bWJlcnMgZm9yIGZveGVzIGFyZSBxdWl0ZSBoaWdoIGZvciBhIHdpbGQgYW5pbWFsLiBUaGlzIGlzIHNvbWV0aGluZyB0aGF0IG5lZWRzIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbiB0byBsZWFybiBtb3JlIGFib3V0LgoKU28sIHdlIGNhbiBzZWUgcXVpdGUgY2xlYXJseSB0aGF0IGRvZ3MgYWNjb3VudCBmb3IgdGhlIG1ham9yaXR5IG9mIHRoZSBjYWxscywgYW5kIG92ZXJzaGFkb3cgY2F0cyBpbiBzZWNvbmQgcGxhY2UgYnkgYSBsYXJnZSBtYXJnaW4uCgoKTm93IHdlIHdpbGwgbG9vayBhdCB0aGUgZGF0YSBicm9rZW4gZG93biBieSBzdWJ1cmIgYW5kIGNvbXBsYWludCB0eXBlLiBUaGlzIHByb3ZlZCBhIGxpdHRsZSBtb3JlIGRpZmZpY3VsdCB0aGFuIG9uZSBtaWdodCBmaXJzdCB0aGluay4gQnJpc2JhbmUgaGFzIDE5MiBzdWJ1cmJzLCB3aGlsZSBUb3duc3ZpbGxlIGhhcyA4NS4gSSBkZWNpZGVkIHRvIGZpcnN0IGZvY3VzIG9uIHRoZSBUb3duc3ZpbGxlIGRhdGEsIGFuZCBkaXN0aWxsIHRoZSBzdWJ1cmJzIGRvd24gdG8gYSBtb3JlIHJlYXNvbmFibGUgbnVtYmVyLiBJIHdhbnRlZCB0byBsb29rIGF0IHN1YnVyYnMgd2l0aCBhIHNpbWlsYXIgYW1vdW50IG9mIGNvbXBsYWludCBjYWxscy4gSSBmb2N1c2VkIG9uIHRob3NlIHdpdGggbGVzcyB0aGFuIDUwMCBhbmQgbW9yZSB0aGFuIDEwMCBjYWxscy4gSSBkZWNpZGVkIHRoYXQgYW55IHN1YnVyYiB3aXRoIGxlc3MgdGhhbiAxMDAgY2FsbHMgd291bGQgYmUgc3VjaCBhIHNtYWxsIG51bWJlciBteSBwZXJjZW50YWdlcyB3b3VsZCBiZSBza2V3ZWQsIGFuZCBubyB2YWxpZCBjb25jbHVzaW9ucyBjb3VsZCBiZSBkcmF3bi4gCgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIGV2YWw9VFJVRX0KYW5pbWFsX2NvbXBsYWludHMgJT4lIAogIGdyb3VwX2J5KHN1YnVyYikgJT4lIAogIHN1bW1hcmlzZShjb3VudCA9IG4oKSwgY29tcGxhaW50X3R5cGUpICU+JSAKICBmaWx0ZXIoY291bnQgPCA1MDAgJiBjb3VudCA+IDEwMCkgJT4lIAogIGdncGxvdChhZXMoeCA9IHN1YnVyYiwgeSA9IGNvdW50LCBmaWxsID0gY29tcGxhaW50X3R5cGUpKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZmlsbCIsIHdpZHRoID0gMC45KSArCiAgY29vcmRfZmxpcCgpICsKICBsYWJzKHRpdGxlID0gIlRvd25zdmlsbGUgQ29tcGxhaW50IFR5cGVzIGJ5IFN1YnVyYiIsCiAgICAgICB4ID0gIlN1YnVyYiIsCiAgICAgICB5ID0gIlByb3BvcnRpb24gb2YgQ29tcGxhaW50IiwKICAgICAgIGNvbG9yID0gIkNvbXBsYWludCBUeXBlIiwKICAgICAgIHN1YnRpdGxlID0gIk5vLiBvZiBDYWxscyA8IDUwMCIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWUgPSAiQ29tcGxhaW50IFR5cGUiKSArCiAgdGhlbWVfZWNvbm9taXN0KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMSwgZmFtaWx5ID0gIm1vbm8iLCBmYWNlID0gImJvbGQiLCBzaXplID0gMTApLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDMuMiksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGZhbWlseSA9ICJtb25vIiksCiAgICAgICAgdGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIm1vbm8iLCBmYWNlID0gImJvbGQiKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC40LCBzaXplID0gMTMpLAogICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjQsIHZqdXN0ID0gMC4wMSwgc2l6ZSA9IDgpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LCBmYW1pbHkgPSAibW9ubyIsIGZhY2UgPSAiYm9sZCIpKQpgYGAKCgoKClNvLCBoZXJlIEkgaGF2ZSBzaG93biB0aGUgcmVsYXRpdmUgcGVyY2VudGFnZXMgb2YgY29tcGxhaW50IHR5cGVzIGZvciB0aGUgc3VidXJicy4gVGhlIGRhdGEgaGFzIGJlZW4gc2NhbGVkLCBzbyB0aGF0IGEgc3VidXJiIHdpdGggYSBoaWdoZXIgY291bnQgZG9lc24ndCBza2V3IHRoZSBkYXRhLCBhbmQgd2UgY2FuIHNlZSBwcm9wb3J0aW9ucy4KCk9uZSB0aGluZyB0byBub3RlIGhlcmUsIGlzIHRoZSB2YXN0IHZhcmlhdGlvbiBpbiB0b2xlcmFuY2UgZm9yIG5vaXNlLiBNb3N0IGNhdGVnb3JpZXMgYXJlIGNvbnNpc3RlbnQgZXhjZXB0IHRoaXMgb25lLiBDbHVkZW4gZm9yIGV4YW1wbGUgaGFzIGEgc21hbGwgcGVyY2VudGFnZSBvZiBub2lzZSBjb21wbGFpbnRzLCB3aGlsZSBCb2hsZSBQbGFpbnMgaGFzIGEgaHVnZSBwZXJjZW50YWdlLiBUaGlzIHJlcXVpcmVzIG1vcmUgaW52ZXN0aWdhdGlvbiB0byBmaWd1cmUgb3V0IHRoZSByb290IGNhdXNlLiAKCkxvb2tpbmcgYXQgdGhlIHNhbWUgYnV0IGluIGEgZGlmZmVyZW50IHdheSwgd2UgZ2V0OgoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCBldmFsPVRSVUV9CmFuaW1hbF9jb21wbGFpbnRzICU+JSAKICBncm91cF9ieShzdWJ1cmIpICU+JSAKICBzdW1tYXJpc2UoY291bnQgPSBuKCksIGNvbXBsYWludF90eXBlLCBhbmltYWxfdHlwZSkgJT4lIAogIGZpbHRlcihjb3VudCA8IDUwMCAmIGNvdW50ID4gMTAwKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gY29tcGxhaW50X3R5cGUsIHkgPSBjb3VudCwgZmlsbCA9IGNvbXBsYWludF90eXBlKSkgKwogIGdlb21fY29sKHdpZHRoID0gMC44KSArCiAgZmFjZXRfd3JhcCh+IHN1YnVyYikgKwogIGxhYnModGl0bGUgPSAiVG93bnN2aWxsZSBDb21wbGFpbnQgVHlwZXMgYnkgU3VidXJiIC0gRmFjZXRlZCIsCiAgICAgICB4ID0gIiIsCiAgICAgICB5ID0gIk51bWJlciBvZiBDYWxscyIsCiAgICAgICBjb2xvciA9ICJDb21wbGFpbnQgVHlwZSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWUgPSAiQ29tcGxhaW50IFR5cGUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6Y29tbWEpICsKICB0aGVtZV9lY29ub21pc3QoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMy4yKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgZmFtaWx5ID0gIm1vbm8iKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQodmp1c3QgPSAtMSksCiAgICAgICAgdGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIm1vbm8iLCBmYWNlID0gImJvbGQiKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC40LCBzaXplID0gMTIpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1LCBmYW1pbHkgPSAibW9ubyIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiwgZmFtaWx5ID0gIm1vbm8iLCBmYWNlID0gImJvbGQiKSkKYGBgCgpUaGlzIGdyYXBoIHNob3dzIHRoZSBzYW1lIHRoaW5nIGFzIGJlZm9yZSBidXQgd2l0aCBjb3VudHMgcmF0aGVyIHRoYW4gcHJvcG9ydGlvbnMuIEl0IGFsbG93cyB1cyB0byBzZWUgdGhpbmdzIGluIGEgZGlmZmVyZW50IHdheS4gRm9yIGV4YW1wbGUsIHdlIGNhbiBzZWUgdGhhdCBIeWRlIFBhcmsgaGFzIGEgZGlzcHJvcG9ydGlvbmF0ZSBhbW91bnQgb2YgcHJpdmF0ZSBpbXBvdW5kcywgd2hpbGUgQm9obGUgcGxhaW5zIGhhcyBtb3JlIG5vaXNlIGNvbXBsYWludHMuIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBwcmV2aW91cyBncmFwaCB0aGF0IHNob3dlZCB1cyBwcm9wb3J0aW9ucywgc28gd2UgY2FuIGJlIGFzc3VyZWQgdGhhdCBvdXIgYW5hbHlzaXMgaXMgYWNjdXJhdGUKCkxvb2tpbmcgYXQgYW5vdGhlciBzdWJzZXQgb2Ygc3VidXJicywgdGhpcyB0aW1lIHRob3NlIHdpdGggdG90YWwgY2FsbHMgYmV0d2VlbiA1MDAgYW5kIDQwMDAsIHdlIGdldCB0aGlzOgoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCBldmFsPVRSVUV9CmFuaW1hbF9jb21wbGFpbnRzICU+JSAKICBncm91cF9ieShzdWJ1cmIpICU+JSAKICBzdW1tYXJpc2UoY291bnQgPSBuKCksIGNvbXBsYWludF90eXBlKSAlPiUgCiAgZmlsdGVyKGNvdW50ID49IDUwMCAmIGNvdW50IDw9IDQwMDApICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBzdWJ1cmIsIHkgPSBjb3VudCwgZmlsbCA9IGNvbXBsYWludF90eXBlKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImZpbGwiKSArCiAgY29vcmRfZmxpcCgpICsKICBsYWJzKHRpdGxlID0gIlRvd25zdmlsbGUgQ29tcGxhaW50IFR5cGVzIGJ5IFN1YnVyYiIsCiAgICAgICB4ID0gIlN1YnVyYiIsCiAgICAgICB5ID0gIlByb3BvcnRpb24gb2YgQ29tcGxhaW50IiwKICAgICAgIGNvbG9yID0gIkNvbXBsYWludCBUeXBlIiwKICAgICAgIHN1YnRpdGxlID0gIk5vLiBvZiBDYWxscyA+IDUwMCIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWUgPSAiQ29tcGxhaW50IFR5cGUiKSArCiAgdGhlbWVfZWNvbm9taXN0KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMSwgZmFtaWx5ID0gIm1vbm8iLCBmYWNlID0gImJvbGQiLCBzaXplID0gMTApLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDMuMiksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGZhbWlseSA9ICJtb25vIiksCiAgICAgICAgdGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIm1vbm8iLCBmYWNlID0gImJvbGQiLCBzaXplID0gOSksCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNCksCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNCwgdmp1c3QgPSAwLjAxKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgZmFtaWx5ID0gIm1vbm8iLCBmYWNlID0gImJvbGQiKSkKYGBgCldoYXQgc3RpY2tzIG91dCB0byBtZSBpbiB0aGVzZSBidXNpZXIgc3VidXJicywgaXMgdGhlIHZhcmlhYmlsaXR5IGluIHByaXZhdGUgaW1wb3VuZHMuIEFpdGtlbnZhbGUsIFRodXJpbmdvd2EgQ2VudHJhbCBhbmQgRG91Z2xhcyBzdGFuZCBvdXQgYXMgYmVpbmcgcHJvcG9ydGlvbmFsbHkgdmVyeSBoaWdoIGluIG51bWJlciBvZiBwcml2YXRlIGltcG91bmRzLiBNb3JlIGludmVzdGlnYXRpb24gaXMgbmVlZGVkIHRvIGZpbmQgb3V0IHRoZSBjYXVzZSBvZiB0aGlzLgoKCk5vdyBsZXQncyBsb29rIGF0IHRoaW5ncyBicm9rZW4gZG93biBieSB0eXBlIG9mIGFuaW1hbCwgcmF0aGVyIHRoYW4gY29tcGxhaW50IHR5cGUuIExvb2tpbmcgYXQgdGhlIG9yaWdpbmFsIHNldCBvZiBzdWJ1cmJzLCB3ZSBnZXQgdGhpczoKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgZXZhbD1UUlVFfQphbmltYWxfY29tcGxhaW50cyAlPiUgCiAgZ3JvdXBfYnkoc3VidXJiKSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpLCBhbmltYWxfdHlwZSkgJT4lIAogIGZpbHRlcihjb3VudCA8IDUwMCAmIGNvdW50ID4gMTAwKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gc3VidXJiLCB5ID0gY291bnQsIGZpbGwgPSBhbmltYWxfdHlwZSkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJmaWxsIikgKwogIGNvb3JkX2ZsaXAoKSArCiAgbGFicyh0aXRsZSA9ICJUb3duc3ZpbGxlIEFuaW1hbCBUeXBlcyBieSBTdWJ1cmIiLAogICAgICAgeCA9ICJTdWJ1cmIiLAogICAgICAgeSA9ICJQcm9wb3J0aW9uIG9mIENhbGxzIiwKICAgICAgIGNvbG9yID0gIkNvbXBsYWludCBUeXBlIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZSA9ICJDb21wbGFpbnQgVHlwZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpjb21tYSkgKwogIHRoZW1lX2Vjb25vbWlzdCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQodmp1c3QgPSAzLjIpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBmYW1pbHkgPSAibW9ubyIpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IC0xKSwKICAgICAgICB0aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAibW9ubyIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjQpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LCBmYW1pbHkgPSAibW9ubyIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYsIGZhbWlseSA9ICJtb25vIiwgZmFjZSA9ICJib2xkIikpCmBgYAoKTW9zdCBzdWJ1cmJzIGhhdmUgcHJldHR5IG11Y2ggdGhlIHNhbWUgcmF0aW9zIG9mIGNhdHMgdG8gZG9ncywgZXhjZXB0IGZvciBUb3duc3ZpbGxlIENpdHkuIFRoaXMgaGFzIGNsb3NlIHRvIDUwOjUwIHJhdGlvLCB3aGljaCBpcyB1bnByZWNlZGVudGVkIGZvciB0aGlzIGRhdGEsIGFuZCBub3Qgc2VlbiBpbiBhbnkgb3RoZXIgVG93bnN2aWxsZSBzdWJ1cmIgKEkgY2hlY2tlZCBldmVuIHRoZSBvdGhlciBncm91cHMpLiBUaGlzIGlzIHRoZSBvbmx5IHN1YnVyYiB3aGVyZSB0aGlzIGlzIHRoZSBjYXNlLiBUaGlzIGNvdWxkIHBvdGVudGlhbGx5IGluZGljYXRlIGEgbGFyZ2UgbnVtYmVyIG9mIHN0cmF5IGNhdHMsIGJ1dCBtb3JlIGludmVzdGlnYXRpb24gaXMgbmVlZGVkIHRvIHNlZSB3aHkgdGhpcyBpcyB0aGUgY2FzZS4KCgoK